//1、 导入必要模块
const JwtStrategy = require('passport-jwt').Strategy;//定义JWT验证策略
const ExtractJwt = require('passport-jwt').ExtractJwt;//从请求中提取JWT。
const User = require('../models/User'); 
const keys = require('./keys');//JWT的密钥，用于签名和验证JWT

//2、 定义JWT策略选项 (opts):
module.exports = (passport) => {
  const opts = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),// 从请求头的Authorization字段提取JWT
    secretOrKey: keys.secretOrKey// 从keys模块中获取的密钥，用于JWT的解密和验证。
  };
//3、 注册JWT策略到Passport:
// 使用passport.use方法注册一个新的策略。这个策略接收两个参数：策略选项（opts）和一个回调函数。
// 回调函数 (jwt_payload, done) 接收JWT解码后的payload（包含用户ID等信息）和一个done函数。
// 在回调中，根据jwt_payload.id查询数据库中的用户。这里使用的是User.findByPk(userId)，假设这是Sequelize ORM中的一个方法，用于根据主键（在这里是用户ID）查找用户。
// 如果用户存在，通过调用done(null, user)将用户对象传递给Passport，表明身份验证成功。
// 如果用户不存在或发生错误，通过done(null, false)或捕获错误并记录日志，表明身份验证失败。
  passport.use(
    new JwtStrategy(opts, (jwt_payload, done) => {
      // 这里可以查询数据库验证jwtPayload的用户是否存在，此处假设jwtPayload包含用户ID
    const userId = jwt_payload.id;
    User.findByPk(userId)
      .then(user => {
        if (user) {
          // 用户存在，将用户对象传递给后续的中间件
          return done(null, user);
        }
        // 用户不存在
        return done(null, false);
      })
      .catch(err => console.log(err));
  })
  );
  return passport;
}